#include "rtc.h"
#include "gpio.h"
#include "lpm.h"

#include "led.h"
#include "QG_driver.h"
#include "uart_api.h"

// volatile uint8_t flag;
extern uint8_t QG_state_start;
extern uint8_t QG_timer_start;
extern uint8_t QG_state_recover;   //报警恢复标志

//闹钟中断间隔
// uint8_t setting_alm_minute = 0x01; //闹钟间隔默认1分钟
// uint8_t setting_alm_hour = 0x00;

// uint8_t wakeup_from_rtc_interval = 0;   //RTC间隔唤醒标志
uint8_t wakeup_from_rtc_alm = 0;        //RTC闹钟唤醒标志

uint8_t doki_interval = 6;              //心跳包上传间隔 默认6分钟
uint8_t wakeup_from_rtc_doki = 0;       //RTC心跳包上传标志

uint8_t timer_shield = 6;             //屏蔽外部中断时间 单位1s
int8_t timer_shield_int_counter = 0;      //屏蔽外部中断计数器 单位1s
volatile int8_t timer_shield_observe = 0;  //屏蔽外部中断的观察标志 单位1s 用来判定是否恢复
extern volatile uint8_t active_during_watch_flag; //在观察期触发标志

uint8_t reset_flag = 0;    //定时重启标志位

 /**
******************************************************************************
** \brief  RTC中断入口函数
** 
** @param  无
** \retval 无
**
******************************************************************************/  
void Rtc_IRQHandler(void)
{
     static uint8_t base_timer_counter = 55; //基础定时器计数器 单位1s
     static uint8_t timer_counter_doki = 5; //心跳包上传定时器计数器 单位1min
     static uint8_t timer_counter_shield_int = 0; //屏蔽外部中断定时器计数器 单位1s

     static uint8_t i = 0;

     if(Rtc_GetPridItStatus() == TRUE)  //判断是周期中断
     {
          Rtc_ClearPrdfItStatus();             //清除中断标志位
//          if(0 == i)
//          {
//               Gpio_ClrIO(APP_LED_PORT, APP_LED_PIN);  //LED翻转
//               i++;
//          }
//          else
//          {
//               Gpio_SetIO(APP_LED_PORT, APP_LED_PIN);  //LED翻转
//               i = 0;
//          }
          
          base_timer_counter++;

          if (base_timer_counter >= 60)      //每60s进位1
          {
               base_timer_counter = 0;       //重置计数器
               timer_counter_doki++;
          }

          //doki时间到
          if (timer_counter_doki >= doki_interval)     //一个可变周期触发一次
          {
               wakeup_from_rtc_doki = 1;
               timer_counter_doki = 0;                 //重置计数器
          }
          
          //外部中断开始屏蔽
          if (QG_timer_start == 1)
          {
               timer_shield_int_counter++;
               if (timer_shield_int_counter >= timer_shield) //屏蔽外部中断时间到
               {
                    timer_shield_int_counter = 0; //重置计数器
                    QG_timer_start = 0;           //重置状态
                    //观察3秒看是否还在触发
                    timer_shield_observe = 5; //设置观察标志
                    // QG_info.state = 0; //功能触发结束
                    Gpio_EnableIrq(QG_STATE_PORT, QG_STATE_PIN, GpioIrqRising); //启用外部中断
                    // Gpio_EnableIrq(QG_STATE_PORT, QG_STATE_PIN, GpioIrqFalling); //启用外部中断
               }
               
          }
          
          //观察倒计时
          // if (timer_shield_observe >= 1)
          // {
          //      timer_shield_observe--;
          //      //观察时间内没有再次触发
          //      if ((timer_shield_observe == 0)&&(active_during_watch_flag != 1)) 
          //      {
          //           QG_state_recover = 1;         //报警恢复
          //      }else if (timer_shield_observe == 0) //观察时间内再次触发
          //      {
          //           QG_state_recover = 0;         //报警恢复
          //           timer_shield_observe = 0;     //重置观察时间
          //           active_during_watch_flag = 0; //在观察期触发
          //      }
          // }
          
     }

     if (Rtc_GetAlmfItStatus() == TRUE) //判断是闹钟中断
     {
          Rtc_ClearAlmfItStatus();       //清中断标志位

          reset_flag = 1;
     }

}


/**
******************************************************************************
** \brief  配置RTC
** 
** @param  无
** \retval 无
**
******************************************************************************/ 
void rtc_init(void)
{
     Debug_Printf("\r\nRTC init...\r\n");
	stc_rtc_initstruct_t RtcInitStruct;
     stc_rtc_alarmtime_t RtcAlmStruct;

     Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE);   //RTC模块时钟打开
     Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);          //使能内部低速时钟RCL
     RtcInitStruct.rtcAmpm = RtcPm;                          //24小时制
     RtcInitStruct.rtcClksrc = RtcClkRcl;                    //内部低速时钟
     RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrdx;            //周期中断类型PRDX
     RtcInitStruct.rtcPrdsel.rtcPrdx = Rtc1S;             //初始化无周期中断
     RtcInitStruct.rtcTime.u8Second = 0x00;                 //设置时间      
     RtcInitStruct.rtcTime.u8Minute = 0x00;                 //设置时间     0分
     RtcInitStruct.rtcTime.u8Hour   = 0x00;                 //设置时间     0时
     RtcInitStruct.rtcTime.u8Day    = 0x02;                 //设置时间     2号
     RtcInitStruct.rtcTime.u8DayOfWeek = 0x01;              //设置时间     周一
     RtcInitStruct.rtcTime.u8Month  = 0x06;                 //设置时间     6月
     RtcInitStruct.rtcTime.u8Year   = 0x25;                 //设置时间     25年
     RtcInitStruct.rtcCompen = RtcCompenEnable;
     RtcInitStruct.rtcCompValue = 0;                         //补偿值 根据实际情况进行补偿
     Rtc_Init(&RtcInitStruct);

     RtcAlmStruct.RtcAlarmMinute = 0x01;               //第一个闹钟在上电后1分钟后触发         
     RtcAlmStruct.RtcAlarmHour = 0x03;
     RtcAlmStruct.RtcAlarmWeek = 0x7f;                    //从周一到周日，每天10:02:05启动一次闹铃
     Rtc_SetAlarmTime(&RtcAlmStruct);                     //配置闹铃时间
     Rtc_AlmIeCmd(TRUE);                                  //使能闹钟中断

     EnableNvic(RTC_IRQn, IrqLevel3, TRUE);                  //使能RTC中断向量
     Rtc_Cmd(TRUE);                                          //使能RTC开始计数
     Rtc_StartWait();                                        //启动RTC计数，如果要立即切换到低功耗，需要执行此函数 
     Debug_Printf("\r\nRTC init success!\r\n");
}





